package interfaces

import (
	"fmt"
)

// Shape 接口定义了几何形状的行为
type Shape interface {
	Area() float64
	Perimeter() float64
}

// Circle 圆形结构体
type Circle struct {
	Radius float64
}

// Area 计算圆的面积
func (c Circle) Area() float64 {
	return 3.14159 * c.Radius * c.Radius
}

// Perimeter 计算圆的周长
func (c Circle) Perimeter() float64 {
	return 2 * 3.14159 * c.Radius
}

// Rectangle 矩形结构体
type Rectangle struct {
	Width  float64
	Height float64
}

// Area 计算矩形的面积
func (r Rectangle) Area() float64 {
	return r.Width * r.Height
}

// Perimeter 计算矩形的周长
func (r Rectangle) Perimeter() float64 {
	return 2 * (r.Width + r.Height)
}

// 接口作为参数
func PrintShapeInfo(s Shape) {
	fmt.Printf("面积: %.2f, 周长: %.2f\n", s.Area(), s.Perimeter())
}

// 空接口演示
func PrintAnything(v interface{}) {
	switch v := v.(type) {
	case int:
		fmt.Printf("这是一个整数: %d\n", v)
	case string:
		fmt.Printf("这是一个字符串: %s\n", v)
	case float64:
		fmt.Printf("这是一个浮点数: %.2f\n", v)
	default:
		fmt.Println("未知类型")
	}
}

// 嵌入结构体（类似继承）
type Person struct {
	Name string
	Age  int
}

func (p Person) Greet() {
	fmt.Printf("你好，我叫%s，今年%d岁\n", p.Name, p.Age)
}

type Student struct {
	Person // 嵌入Person结构体
	School string
	Grade  int
}

// 重写方法
func (s Student) Greet() {
	fmt.Printf("你好，我叫%s，是%s的%d年级学生\n", s.Name, s.School, s.Grade)
}

// DemoInterfaces 展示接口和面向对象特性
func DemoInterfaces() {
	// 接口实现
	circle := Circle{Radius: 5}
	rectangle := Rectangle{Width: 4, Height: 6}

	fmt.Print("圆形: ")
	PrintShapeInfo(circle)

	fmt.Print("矩形: ")
	PrintShapeInfo(rectangle)

	// 空接口
	PrintAnything(42)
	PrintAnything("Hello")
	PrintAnything(3.14)

	// 结构体嵌入和方法重写
	person := Person{Name: "张三", Age: 30}
	person.Greet()

	student := Student{
		Person: Person{Name: "李四", Age: 15},
		School: "阳光中学",
		Grade:  9,
	}
	student.Greet()
	// 访问嵌入结构体的方法
	student.Person.Greet()
}
